Skip to main content

ReadNCFile2 mit Token-Modifizierer

Das Beispielprojekt CNC12_TokenModifier.project finden Sie im Installationsverzeichnis von CODESYS unter ..\CODESYS SoftMotion\Examples.

Dieses Beispiel zeigt, wie Sie den G-Code beim Einlesen modifizieren können, um die Einheit der Bahngeschwindigkeit (F-Wort) von mm/min in mm/s umzuwandeln. Dies wird erreicht, indem Sie während des Einlesens des G-Codes beim F-Wort vor dem Geschwindigkeitswert den G-Code 1/60.0 * einfügen. Aus F6000 wird dann F 1/60.0 * 6000, was vom Funktionsbaustein SMC_NCInterpreter dann zu F100 verarbeitet wird. In einfachen Fällen könnten Sie auf eine Multiplikation mit 1/60 verzichten und einfach den Wert, beispielsweise von 6000 auf 100, anpassen. Die Multiplikation ist aber allgemeiner, da sie auch bei Verwendung von Variablen funktioniert. Aus F $SPEED$ wird F 1/60.0 * $SPEED$.

Struktur der Applikation

Die Applikation besteht, wie für CNC-Applikationen üblich, aus einer Bahnverarbeitung (Programm CNC_PreparePath) und der Interpolation (Programm CNC). Da die Interpolation sich nicht von den anderen Beispielen unterscheidet, wird hier nicht weiter darauf eingegangen.

Die Bahnverarbeitung wird in der niederprioren Task PathTask zyklisch alle 20 ms aufgerufen. Die Interpolation wird in der hochprioren Task MotionTask zyklisch alle 4 ms aufgerufen. Für die Visualisierung wird die Hintergrund-Task VISU_TASK definiert.

In der Visualisierung können Sie die Abarbeitung des G-Codes starten. Auf der rechten Seite der Visualisierung wird der G-Code und die Bewegung der Maschine (3D-Portals) dargestellt.

Der G-Code

CNC_PathSpeed

N10 G01 X1000 F6000
N20 Y1000

In diesem G-Code wird die Bahngeschwindigkeit in Satz N10 mit F6000 auf 6000 mm/min vorgegeben. Die Bausteine der CNC erwarten jedoch die Bahngeschwindigkeit in mm/s. Es werden zwei lineare Bewegungen kommandiert, zuerst nach X=1000, dann nach X=1000, Y=1000.

Token-Verarbeitung

Die Bausteine SMC_ReadNCFile2 und SMC_ReadNCFromStream bieten die Möglichkeit, beim Einlesen des G-Codes eigene Transformationen durchzuführen. Hier beschäftigen wir uns mit der Schnittstelle SMC_ITokenModifier, die über den Eingang aTokenModifier übergeben wird.

Diese Schnittstelle arbeitet auf sogenannten "Token". Das sind die Grundbestandteile des G-Codes, in die der G-Code-Text zu Beginn der Verarbeitung zerlegt wird.

Beispiel 54. Beispiel
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)

Dieser G-Code wird folgendermaßen zerlegt:

Text

SMC_TOKENTYPE

SMC_TOKENVALUE

N

identifer

stValue = 'N'

50

number

fValue = 50.0

G

identifer

stValue = 'G'

36

number

fValue = 36.0

O

identifer

stValue = 'O'

$plc_variable$

variable

stValue = 'plc_variable'

D

identifer

stValue = 'D'

'TextTest'

strLiteral

stValue = 'TextTest'

X

identifer

stValue = 'X'

-

operator

stValue = '-'

1

number

fValue = 1.0



Für die weitere Verarbeitung nicht benötigte Informationen, wie Whitespace-Zeichen, Zeilenumbrüche oder Kommentare, kommen in der Liste der Tokens nicht vor.

Wenn die Schnittstelle SMC_ITokenModifier implementiert wird, kann die Liste der Tokens durch Einfügen neuer Tokens, Löschen von Tokens und Änderung des Werts von Tokens angepasst werden.

. Die Schnittstelle definiert zwei Methoden:
  • Start: Initialisierung des Bausteins. Der interne Zustand wird zurückgesetzt.

  • Call: Aufruf dieser Methode während der Abarbeitung des G-Codes. Token können aus der Eingangs-Queue gelesen und entfernt werden und in die Ausgangs-Queue eingefügt werden.

Umsetzung

. Der Ablauf der Verarbeitung ist wie folgt:
  • Alle Token werden von der Eingangs-Queue in die Ausgangs-Queue verschoben.

  • Wenn ein F-Word enthalten ist, werden nach dem Token für "F" und vor dem Token für den Wert der Geschwindigkeit zwei neue Token 1/60 und * eingefügt.

Die Methode Call enthält die Logik, um die Tokens zu verarbeiten. Es ist hilfreich, die Token der Eingangs-Queue (tokensIn) zunächst in eine temporäre Queue (m_tmpQueue) zu verschieben, dort zu verarbeiten und danach in die Ausgangs-Queue (tokensOut) zu verschieben. Für die Anpassung der Bahngeschwindigkeit ist die temporäre Queue nicht unbedingt nötig, vereinfacht aber die Programmstruktur in komplizierteren Fällen.

Methode Call

Zu Beginn wird im Zustand STATE_RUNNING gewartet, bis die Bearbeitung starten kann, also bis Token in der Eingangs-Queue vorhanden sind und gleichzeitig noch Platz in der Ausgangs-Queue ist.

IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN
    // Wait until processing can proceed
    RETURN;
END_IF

Danach wird ein Token aus der Eingangs-Queue in die temporäre Queue verschoben.

IF m_tmpQueue.IsEmpty() THEN
    // Move the next token from the in-queue to the tmp-queue.
    pt := tokensIn.GetFromStart(0);
    m_tmpQueue.Append(pt^);
    tokensIn.RemoveFirst();
END_IF

Die eigentliche Verarbeitung erfolgt dann in der Methode ConvertSpeed.

IF NOT m_tmpQueue.IsEmpty() THEN
    // The actual processing is done here
    ConvertSpeed();
END_IF

Am Ende der Methode wird dann ein Token aus der temporären Queue in die Ausgangs-Queue verschoben.

Methode ConvertSpeed

Es wird das erste Token aus der temporären Queue geprüft.

Wenn ein Bezeichner mit Wert F gefunden wird, dann werden zwei zusätzliche Token eingefügt: die Zahl 1/60.0 und der Operator *.

(Die Größe der temporären Queue ist so gewählt, dass neben dem einen Token aus der Eingangs-Queue noch zwei weitere Token in die Queue passen.)

tk := m_tmpQueue.GetFromStart(0)^;

IF tk.tokenType = SMC_TokenType.identifier THEN
    tk.GetString(pbyString => pby, iSize => iSize);
    // 70 = ASCII code for F (path velocity)
    IF iSize = 1 AND pby^ = 70 THEN
        // Insert the number 1/60
        SMC_Token_InitNumber(
            tk:= tkNumber,
            value:= 1/60.0,
            srcPos:= tk.srcPos);
        m_tmpQueue.Append(tkNumber);

        // Insert operator '*' for multiplication
        SMC_Token_InitOperator(
            tk:= tkOperator,
            value:= '*',
            srcPos:= tk.srcPos);
        m_tmpQueue.Append(tkOperator);
    END_IF
END_IF

Inbetriebnahme

  1. Übersetzen Sie die Applikation und laden Sie sie auf eine Steuerung.

  2. Starten Sie die Applikation, wechseln Sie zur Visualisierung und drücken Sie auf Start.